// 导入 Node.js 的 url 模块中的 fileURLToPath 和 URL 函数
import { fileURLToPath, URL } from 'node:url';
// 导入 Vite 的 defineConfig 和 loadEnv 函数
import { defineConfig, loadEnv } from 'vite';
// 导入 Vite 的 Vue 插件
import vue from '@vitejs/plugin-vue';

// 导出 Vite 配置
export default defineConfig(({ mode }) => {
    // 定义输出文件名对象
    let outputNames: any = {};
    // 从环境变量中加载配置
    const {
        VITE_HTTP_HOST,
        VITE_HTTP_PORT,
        VITE_HTTP_API,
        VITE_DIST_DIR,
        VITE_API_URL,
    } = loadEnv(mode, process.cwd(), '');

    // 判断是否为开发环境
    const IS_DEV = mode === 'development';
    // 设置输出文件名
    outputNames = {
        entryFileNames: 'static/js/as-[hash].js',
        chunkFileNames: 'static/js/asai-as-[hash].js',
        assetFileNames: 'static/asset/[ext]-as-[hash].[ext]',
    };
    // 定义手动代码分割函数
    const manualChunks = !IS_DEV
        ? (id: any) => {
              if (id.includes('node_modules')) {
                  return id
                      .toString()
                      .split('node_modules/')[1]
                      .split('/')[0]
                      .toString();
              }
          }
        : () => {};

    // 定义 Vite 插件数组
    const plugins = [
        vue(),
        // 为生成的JS增加后缀
        // {
        //     name: 'cache-busting',
        //     transformIndexHtml(html) {
        //         // 为所有本地 JS 文件添加时间戳查询参数
        //         return html
        //             .replace(
        //                 /(<script\s+[^>]*src=")([^"]+\.js)"/g,
        //                 (match, prefix, src) => {
        //                     // 跳过外部资源
        //                     if (
        //                         src.startsWith('http') ||
        //                         src.startsWith('//')
        //                     ) {
        //                         return match;
        //                     }
        //                     // 添加随机查询参数
        //                     return `${prefix}${src}?v=${Date.now()}"`;
        //                 }
        //             )
        //             .replace(
        //                 /(<link\s+[^>]*href=")([^"]+\.js)"/g,
        //                 (match, prefix, src) => {
        //                     // 跳过外部资源
        //                     if (
        //                         src.startsWith('http') ||
        //                         src.startsWith('//')
        //                     ) {
        //                         return match;
        //                     }
        //                     // 添加随机查询参数
        //                     return `${prefix}${src}?v=${Date.now()}"`;
        //                 }
        //             );
        //     },
        // },
    ];

    return {
        plugins,
        // base: '/',
        // 将打包后的绝对路径改为相对路径
        base: './',
        // 配置别名，注意：需要在tsconfig配置中同步
        resolve: {
            alias: {
                '@': fileURLToPath(new URL('./src', import.meta.url)),
            },
        },
        // ffmpeg专用，解决ReferenceError: SharedArrayBuffer is not defined
        optimizeDeps: {
            //     exclude: ['@ffmpeg/ffmpeg', '@ffmpeg/util'],
            include: [
                'monaco-editor/esm/vs/language/json/json.worker',
                'monaco-editor/esm/vs/editor/editor.worker',
            ],
        },
        css: {
            preprocessorOptions: {
                scss: {
                    api: 'modern-compiler', // 或 "modern"
                    silenceDeprecations: ['legacy-js-api'],
                },
            },
        },
        // 开发者相关的服务配置
        server: {
            // ffmpeg专用，解决ReferenceError: SharedArrayBuffer is not defined
            headers: {
                'Cross-Origin-Embedder-Policy': 'require-corp',
                'Cross-Origin-Opener-Policy': 'same-origin',
            },
            // 调试网址
            host: VITE_HTTP_HOST,
            // 调试端口
            port: Number(VITE_HTTP_PORT),
            // 是否在运行时自动打开浏览器
            open: true,
            // 跨域设置
            cros: true,
            // 代理配置
            proxy: {
                ['^' + VITE_API_URL]: {
                    target: VITE_HTTP_API,
                    changeOrigin: true,
                    rewrite: (path) =>
                        path.replace(new RegExp('^' + VITE_API_URL), ''),
                },
            },
        },
        // 打包构建时的配置
        build: {
            // 非生产环境生成 sourcemap
            sourcemap: IS_DEV,
            outDir: VITE_DIST_DIR,
            // assetsDir: VITE_DIST_DIR + 'public/', // 指定生成静态资源的存放路径（与ffmpeg冲突）
            // Rollup 打包配置
            // 清空打包目录
            emptyOutDir: !IS_DEV,
            rollupOptions: {
                // external: ['@ffmpeg/ffmpeg', '@ffmpeg/util'],
                // external: ['vue', 'element-plus'], // 确保外部化处理那些你不想打包进库的依赖
                output: {
                    // globals: {
                    //   vue: 'Vue', // 在 UMD 构建模式下为这些外部化的依赖提供一个全局变量
                    //   'element-plus': 'elementPlus',
                    // },
                    ...outputNames,
                    // chunkFileNames: 'static/js/chunk-[name]-[hash].js',
                    // entryFileNames: 'static/js/entry-[name]-[hash].js',
                    // assetFileNames: 'static/asset/[ext]-[name]-[hash].[ext]',
                    manualChunks,
                },
                // plugins: [
                // visualizer({ open: true, gzipSize: true })
                // ],
            },
            // 块大小警告限制
            chunkSizeWarningLimit: 4000,
            // css 拆分
            cssCodeSplit: true,
            // 小于该值 图片将打包成Base64
            assetsInlineLimit: 10000,
            // 是否禁用最小化混淆，esbuild打包速度最快，'terser'打包体积最小。
            minify: IS_DEV ? 'esbuild' : 'terser',
            target: 'esnext',
            terserOptions: {
                compress: {
                    // 非开发环境且drop_console为false时删除控制台日志
                    drop_console: !IS_DEV && false,
                    // 非开发环境删除调试器语句
                    drop_debugger: !IS_DEV && true,
                },
            },
        },
    };
});
